#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<unistd.h>
#include<sys/types.h>
#include<wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#define _SIZE 1024 
#define _ARGVSIZE 32
int lastcode = 0;
int quit = 0;
//获得最后一个路径
const char* getpwd()
{
    char* h = getenv("PWD");
    size_t i = 0;
    while(h[i])
    {
        if(h[i] == '/')
        {
            strcpy(h,h+i+1);
        }
        ++i;
    }
    return h;
}
//获取命令
void interact(char* str, size_t size)
{
    printf("[%s@%s %s]&", getenv("USER"), getenv("HOSTNAME"), getpwd());                                                                                       
    char* s = fgets(str, size, stdin);
    if(s == NULL)
    {
        perror("fget");
        exit(1);
    }
    str[strlen(str)-1] = '\0';
}
//普通命令
void normalexecute(char** argv)
{                                                                                                                                                              
    pid_t id = fork();
    if(id < 0)
    {
        perror("fore");
        return;
    }
    if(id == 0)
    {
        //execvpe(argv[0], argv, environ);
        execvp(argv[0], argv);
        exit(2);
        }
    else
    {
        int status = 0;
        pid_t cid = wait(&status);
        if(cid == id)
        {
            //lastcode = WEXITSTAUS(status);
        }
    }
}
//内建命令
int buldincommand(int argc, char** argv)
{
    //重定向
    //printf("%s\n", argv[argc-1]);
    if(strcmp(argv[argc-2], ">") == 0)
    {
        int n = open(argv[argc-1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
        if(n < 0)
        {
            perror("open");
            exit(3);
        }
        dup2(n, 1);
        argv[--argc] = NULL;
        argv[--argc] = "\n";
    }
    if(argc == 2 && strcmp(argv[0], "cd") == 0)
    {
        chdir(argv[1]);
        char _pwd[1024];
        getcwd(_pwd,sizeof(_pwd));
        sprintf(getenv("PWD"), "%s", _pwd);
        return 1;
    }
    if(argc == 2 && strcmp(argv[0], "echo") == 0)
    {
        printf("%s\n", argv[1]);
        return 1;
    }

    if(strcmp(argv[0], "ls") == 0)
    {
        argv[argc++] = "--color";
        argv[argc] = NULL;
    }
    return 0;
}
// //重定向
// void redirect(int argc, char** argv)
// {
//     dup2(n, 1);
//     int l = buldincommand(argc, argv);
//     if(l == 0)
//         normalexecute(argv);
// }
//分离命令
int takestr(char** argv, char* str)
{
    char* t = {" "};
    char* ret;
    int i = 0;
    argv[i++] = strtok(str, t);
    while(ret = strtok(NULL, t))
    {
        // if(strcmp(ret, ">") == 0)
        // {
        //     //argv[i++] = "\0";
        //     while(ret = strtok(NULL, t))
        //     {
        //         argv[i++] = ret;
        //     }
        //     redirect(i, argv);
        // }
        // else
        argv[i++] = ret;
    }
    return i;
}

int main()
{
    //extern char** environ;
    char str[_SIZE] = "\0";
    char* argv[_ARGVSIZE] = {NULL};
    while(!quit)
    {
        interact(str,sizeof(str));
        //printf("%s\n", str);
        int argc = takestr(argv,str);
        if(argc == 0) continue;
        // for(int i = 0; argv[i]; i++)
        // {
        //     printf("%s\n", argv[i]);
        // }
        int l = buldincommand(argc, argv);
        if(l == 0)
            normalexecute(argv);
        dup2(2, 1);
    }
    return 0;
}